home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / nurb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  5.2 KB  |  320 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "gl.h"
  5. #include "glu.h"
  6. #include <math.h>
  7. #include "tk.h"
  8.  
  9.  
  10. #define INREAL float
  11.  
  12. #define S_NUMPOINTS 13
  13. #define S_ORDER     3   
  14. #define S_NUMKNOTS  (S_NUMPOINTS + S_ORDER)
  15. #define T_NUMPOINTS 3
  16. #define T_ORDER     3 
  17. #define T_NUMKNOTS  (T_NUMPOINTS + T_ORDER)
  18. #define SQRT_TWO    1.41421356237309504880
  19.  
  20.  
  21. typedef INREAL Points[4];
  22.  
  23.  
  24. GLenum doubleBuffer, directRender;
  25.  
  26. GLenum expectedError;
  27. GLint rotX = 40, rotY = 40;
  28. INREAL sknots[S_NUMKNOTS] = {
  29.     -1.0, -1.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0,
  30.     4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 9.0, 9.0
  31. };
  32. INREAL tknots[T_NUMKNOTS] = {
  33.     1.0, 1.0, 1.0, 2.0, 2.0, 2.0
  34. };
  35. Points ctlpoints[S_NUMPOINTS][T_NUMPOINTS] = {
  36.     {
  37.     {
  38.         4.0, 2.0, 2.0, 1.0
  39.     },
  40.     {
  41.         4.0, 1.6, 2.5, 1.0
  42.     },
  43.     {
  44.         4.0, 2.0, 3.0, 1.0
  45.     }
  46.     },
  47.     {
  48.     {
  49.         5.0, 4.0, 2.0, 1.0
  50.     },
  51.     {
  52.         5.0, 4.0, 2.5, 1.0
  53.     },
  54.     {
  55.         5.0, 4.0, 3.0, 1.0
  56.     }
  57.     },
  58.     {
  59.     {
  60.         6.0, 5.0, 2.0, 1.0
  61.     },
  62.     {
  63.         6.0, 5.0, 2.5, 1.0
  64.     },
  65.     {
  66.         6.0, 5.0, 3.0, 1.0
  67.     }
  68.     },
  69.     {
  70.     {
  71.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  72.     },
  73.     {
  74.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  75.     },
  76.     {
  77.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  78.     }  
  79.     },
  80.     {
  81.     {
  82.         5.2, 6.7, 2.0, 1.0
  83.     },
  84.     {
  85.         5.2, 6.7, 2.5, 1.0
  86.     },
  87.     {
  88.         5.2, 6.7, 3.0, 1.0
  89.     }
  90.     },
  91.     {
  92.     {
  93.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  94.     },
  95.     {
  96.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  97.     }, 
  98.     {
  99.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  100.     }  
  101.     }, 
  102.     {
  103.     {
  104.         4.0, 5.2, 2.0, 1.0
  105.     },
  106.     {
  107.         4.0, 4.6, 2.5, 1.0
  108.     },
  109.     {
  110.         4.0, 5.2, 3.0, 1.0
  111.     }  
  112.     },
  113.     {
  114.     {
  115.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  116.     },
  117.     {
  118.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  119.     },
  120.     {
  121.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  122.     }  
  123.     },
  124.     {
  125.     {
  126.         2.8, 6.7, 2.0, 1.0
  127.     },
  128.     {
  129.         2.8, 6.7, 2.5, 1.0
  130.     },
  131.     {
  132.         2.8, 6.7, 3.0, 1.0
  133.     }   
  134.     },
  135.     {
  136.     {
  137.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  138.     },
  139.     {
  140.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  141.     },
  142.     {
  143.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  144.     }  
  145.     },
  146.     {
  147.     {
  148.         2.0, 5.0, 2.0, 1.0
  149.     },
  150.     {
  151.         2.0, 5.0, 2.5, 1.0
  152.     },
  153.     {
  154.         2.0, 5.0, 3.0, 1.0
  155.     } 
  156.     },
  157.     {
  158.     {
  159.         3.0, 4.0, 2.0, 1.0
  160.     },
  161.     {
  162.         3.0, 4.0, 2.5, 1.0
  163.     },
  164.     {
  165.         3.0, 4.0, 3.0, 1.0
  166.     } 
  167.     },
  168.     {
  169.     {
  170.         4.0, 2.0, 2.0, 1.0
  171.     },
  172.     {
  173.         4.0, 1.6, 2.5, 1.0
  174.     },
  175.     {
  176.         4.0, 2.0, 3.0, 1.0
  177.     }    
  178.     }
  179. };
  180. GLUnurbsObj *theNurbs;
  181.  
  182.  
  183. static void ErrorCallback(GLenum which)
  184. {
  185.  
  186.     if (which != expectedError) {
  187.     fprintf(stderr, "Unexpected error occured (%d):\n", which);
  188.     fprintf(stderr, "    %s\n", gluErrorString(which));
  189.     }
  190. }
  191.  
  192. static void Init(void)
  193. {
  194.  
  195.     theNurbs = gluNewNurbsRenderer();
  196.     gluNurbsCallback(theNurbs, GLU_ERROR, (void (*)(void)) ErrorCallback);
  197.  
  198.     gluNurbsProperty(theNurbs, GLU_SAMPLING_TOLERANCE, 15.0);
  199.     gluNurbsProperty(theNurbs, GLU_DISPLAY_MODE, GLU_OUTLINE_PATCH);
  200.  
  201.     expectedError = GLU_INVALID_ENUM;
  202.     gluNurbsProperty(theNurbs, ~0, 15.0);
  203.     expectedError = GLU_NURBS_ERROR13;
  204.     gluEndSurface(theNurbs);
  205.     expectedError = 0;
  206.  
  207.     glColor3f(1.0, 1.0, 1.0);
  208. }
  209.  
  210. static void Reshape(int width, int height)
  211. {
  212.  
  213.     glViewport(0, 0, (GLint)width, (GLint)height);
  214.  
  215.     glMatrixMode(GL_PROJECTION);
  216.     glLoadIdentity();
  217.     glFrustum(-2.0, 2.0, -2.0, 2.0, 0.8, 10.0);
  218.     gluLookAt(7.0, 4.5, 4.0, 4.5, 4.5, 2.5, 6.0, -3.0, 2.0);
  219.     glMatrixMode(GL_MODELVIEW);
  220. }
  221.  
  222. static GLenum Key(int key, GLenum mask)
  223. {
  224.  
  225.     switch (key) {
  226.       case TK_ESCAPE:
  227.     tkQuit();
  228.       case TK_DOWN:
  229.     rotX -= 5;
  230.     break;
  231.       case TK_UP:
  232.     rotX += 5;
  233.     break;
  234.       case TK_LEFT:
  235.     rotY -= 5;
  236.     break;
  237.       case TK_RIGHT:
  238.     rotY += 5;
  239.     break;
  240.       default:
  241.     return GL_FALSE;
  242.     }
  243.     return GL_TRUE;
  244. }
  245.  
  246. static void Draw(void)
  247. {
  248.  
  249.     glClear(GL_COLOR_BUFFER_BIT);
  250.  
  251.     glPushMatrix();
  252.  
  253.     glTranslatef(4.0, 4.5, 2.5);
  254.     glRotatef(rotY, 1, 0, 0);
  255.     glRotatef(rotX, 0, 1, 0);
  256.     glTranslatef(-4.0, -4.5, -2.5);
  257.  
  258.     gluBeginSurface(theNurbs);
  259.     gluNurbsSurface(theNurbs, S_NUMKNOTS, sknots, T_NUMKNOTS, tknots,
  260.             4*T_NUMPOINTS, 4, &ctlpoints[0][0][0], S_ORDER,
  261.             T_ORDER, GL_MAP2_VERTEX_4);
  262.     gluEndSurface(theNurbs);
  263.  
  264.     glPopMatrix();
  265.  
  266.     glFlush();
  267. }
  268.  
  269. static GLenum Args(int argc, char **argv)
  270. {
  271.     GLint i;
  272.  
  273.     doubleBuffer = GL_FALSE;
  274.     directRender = GL_TRUE;
  275.  
  276.     for (i = 1; i < argc; i++) {
  277.     if (strcmp(argv[i], "-sb") == 0) {
  278.         doubleBuffer = GL_FALSE;
  279.     } else if (strcmp(argv[i], "-db") == 0) {
  280.         doubleBuffer = GL_TRUE;
  281.     } else if (strcmp(argv[i], "-dr") == 0) {
  282.         directRender = GL_TRUE;
  283.     } else if (strcmp(argv[i], "-ir") == 0) {
  284.         directRender = GL_FALSE;
  285.     } else {
  286.         printf("%s (Bad option).\n", argv[i]);
  287.         return GL_FALSE;
  288.     }
  289.     }
  290.     return GL_TRUE;
  291. }
  292.  
  293. void main(int argc, char **argv)
  294. {
  295.     GLenum type;
  296.  
  297.     if (Args(argc, argv) == GL_FALSE) {
  298.     tkQuit();
  299.     }
  300.  
  301.     tkInitPosition(30, 60, 300, 300);
  302.  
  303.     type = TK_RGB;
  304.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  305.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  306.     tkInitDisplayMode(type);
  307.  
  308.     if (tkInitWindow("NURBS Test") == GL_FALSE) {
  309.     tkQuit();
  310.     }
  311.  
  312.     Init();
  313.  
  314.     tkExposeFunc(Reshape);
  315.     tkReshapeFunc(Reshape);
  316.     tkKeyDownFunc(Key);
  317.     tkDisplayFunc(Draw);
  318.     tkExec();
  319. }
  320.